Repository navigation
feat(ai): hold auto-applied repairs to the previous version's hosts (+ scan specs) - #663
Merged
Merged
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## main #663 +/- ##
==========================================
- Coverage 88.17% 88.17% -0.01%
==========================================
Files 1288 1289 +1
Lines 131355 131553 +198
==========================================
+ Hits 115827 116001 +174
- Misses 15519 15543 +24
Partials 9 9
🚀 New features to boost your workflow:
|
…annot take it Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A `repair: auto` candidate that kept the previous literal host and added a branch to a host built at runtime passed every gate and was applied. Its scheduled runs had no host allowlist, so the branch could send a secret to any public host (security scan 2026-10-24, finding R1). - applyRepair stores the hosts the previous version reached in the ai block (`repair_hosts`), bound to the applied script and env (`repair_grant`). - Every run of that version with real secrets is held to them. A refusal fails the run with an error result flagged `aiRepairHostRefused`. - Such a result sets the check back to `repair: propose` and records a `check.ai_repair_revoked` event, instead of queueing a repair. - Editing the script or env drops the grant (js NormalizeConfig). - `repair: auto` now proposes any candidate with a network call whose host its text does not show, or more network calls than before (hiddenHost, replaces hostsHidden). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…eeps a readable host and adds one built at runtime Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
fclairamb
enabled auto-merge (squash)
October 25, 2026 16:15
This was referenced Oct 25, 2026
fclairamb
added a commit
that referenced
this pull request
Oct 26, 2026
) Specs filed from the daily security scans, and the fix for the one still open. ## What changed - **U1 (low)**: `specs/done/2026/10/2026-10-26-02-ai-repair-hold-skips-param-only-secrets.md`. Every scheduled run of a `repair: auto` version is now held to its granted hosts, whether its credentials sit in `secrets` or come from a `${param:…}` / `${env:…}` reference. Before, a check with no `secrets` value ran unheld with the resolved value. Tests cover the checker, the worker claim path and the agent path, each with a positive control. Docs updated. Batch gate green (`make build-backend lint-back test`). ## Decided by autopilot - Nothing: the spec had no open questions. ## Earlier scan specs (implemented, in `specs/done/2026/10/`) - **S1 (medium)**: `2026-10-25-01-ai-repair-grant-dropped-by-reference-resolution.md`. The repair grant was compared after `${…}` references were resolved. Fixed in #678; see U1 for a remaining gap. - **R1 (medium)**: `2026-10-24-01-ai-repair-auto-apply-partial-runtime-host.md`. `repair: auto` applied a candidate that kept a literal host and added one built at runtime. Fixed in #663. - **Q1 (medium)**: `2026-10-23-02-ai-loop-secret-relay-through-model.md`. AI loops relayed an encoded secret through the model. - **P1 (medium)**: `2026-10-22-01-ai-script-secret-host-guard-runtime.md`. AI runs with real secrets were only host-checked by regex. - **K1 (medium)**: `2026-10-20-01-sender-response-body-caps.md`. Notification senders and RabbitMQ read responses uncapped. - **J1 (medium)**: `2026-10-19-01-a2a-response-size-cap.md`. A2A responses were read uncapped. - **I1 (low)**: `2026-10-18-01-plugin-schema-file-ref.md`. Plugin schema `$ref` could load local files. - **G1/G2 (low)**: `2026-10-17-01-postgres-check-connection-config.md`. Postgres conninfo escaping and fallback to the worker's `PG*` env. - **F1**: `2026-10-16-15-pat-cache-revocation.md`. The PAT cache outlived revocation. - **E1**: `2026-10-16-14-totp-on-federated-sign-in.md`. No TOTP on federated sign-in. - **E2**: `2026-10-16-13-atomic-auth-attempt-counters.md`. Auth attempt counters were not atomic. - **H3**: `2026-10-16-12-mcp-tokens-rejected-on-rest.md`. MCP OAuth tokens worked on REST. - **H2**: `2026-10-16-11-slack-signature-fail-closed.md`. Slack signature check failed open. - **T1 / M2 (high)**: `2026-10-16-10-discovery-scans-egress-guard.md`. Discovery scans were outside the egress policy. - **N4**: `2026-10-16-09-js-check-nested-docker-guard.md`. A JS `docker` sub-check bypassed the gate. - **N3 (high)**: `2026-10-16-08-status-page-components-cross-org.md`. Status-page components could be edited across orgs. - **D2/D3 (high)**: `2026-10-16-07-guard-status-subscriber-and-publication-webhooks.md`. Subscriber and publication webhooks were not guarded. - **C3**: `2026-10-16-06-accept-invite-existing-account.md`. Accepting an invite logged in as an existing account. - **C1**: `2026-10-16-05-kubeconfig-exec-and-incluster.md`. Kubeconfig `exec` and `inCluster` were allowed. - **N2**: `2026-10-16-04-mysql-dsn-injection.md`. MySQL DSN injection. - **N1**: `2026-10-16-03-env-secret-reference-allowlist.md`. No allowlist for `${env:}` references. - **C2/H1**: `2026-10-16-02-token-purpose-separation.md`. Purpose tokens were accepted as access tokens. - **D1**: `2026-10-16-01-microsoft-signin-unverified-email-linking.md`. Microsoft nOAuth email linking. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Specs filed from the daily security scans. Each spec is the tracker for its finding.
This branch also carries the maintainer's R1 fix (
08c3aa21and follow-ups), so it is no longer specs-only.Open (added by this PR)
specs/todos/2026-10-25-01-ai-repair-grant-dropped-by-reference-resolution.md. The R1 repair grant is compared against the script and env after${var:}/${param:}/${env:}references are resolved. Any reference in an auto-repaired script or env therefore silently drops the host allowlist on scheduled runs. It is a bypass of the R1 fix on this branch.Earlier scan specs on this branch (implemented, in
specs/done/2026/10/)2026-10-24-01-ai-repair-auto-apply-partial-runtime-host.md.repair: autoapplied a candidate that kept a literal host and added one built at runtime. Fixed on this branch; see S1 for a gap.2026-10-23-02-ai-loop-secret-relay-through-model.md. AI loops relayed an encoded secret through the model.2026-10-22-01-ai-script-secret-host-guard-runtime.md. AI runs with real secrets were only host-checked by regex.2026-10-20-01-sender-response-body-caps.md. Notification senders and RabbitMQ read responses uncapped.2026-10-19-01-a2a-response-size-cap.md. A2A responses were read uncapped.2026-10-18-01-plugin-schema-file-ref.md. Plugin schema$refcould load local files.2026-10-17-01-postgres-check-connection-config.md. Postgres conninfo escaping and fallback to the worker'sPG*env.2026-10-16-15-pat-cache-revocation.md. The PAT cache outlived revocation.2026-10-16-14-totp-on-federated-sign-in.md. No TOTP on federated sign-in.2026-10-16-13-atomic-auth-attempt-counters.md. Auth attempt counters were not atomic.2026-10-16-12-mcp-tokens-rejected-on-rest.md. MCP OAuth tokens worked on REST.2026-10-16-11-slack-signature-fail-closed.md. Slack signature check failed open.2026-10-16-10-discovery-scans-egress-guard.md. Discovery scans were outside the egress policy.2026-10-16-09-js-check-nested-docker-guard.md. A JSdockersub-check bypassed the gate.2026-10-16-08-status-page-components-cross-org.md. Status-page components could be edited across orgs.2026-10-16-07-guard-status-subscriber-and-publication-webhooks.md. Subscriber and publication webhooks were not guarded.2026-10-16-06-accept-invite-existing-account.md. Accepting an invite logged in as an existing account.2026-10-16-05-kubeconfig-exec-and-incluster.md. KubeconfigexecandinClusterwere allowed.2026-10-16-04-mysql-dsn-injection.md. MySQL DSN injection.2026-10-16-03-env-secret-reference-allowlist.md. No allowlist for${env:}references.2026-10-16-02-token-purpose-separation.md. Purpose tokens were accepted as access tokens.2026-10-16-01-microsoft-signin-unverified-email-linking.md. Microsoft nOAuth email linking.🤖 Generated with Claude Code